﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;

namespace TumbaloSoft.Controllers
{
    public class ClienteController : TumbaloController
    {

        /*Dividido en Cliente Natural y Cliente Juridico */
        private static Object lockObject = new Object();
        /*-----------------------------Index Cliente-------------------------------------*/

        public ActionResult Index()
        {
            if (defaultAction != null) return defaultAction;
            return View();
        }


        [HttpPost]
        public ActionResult Index(string tipoPersona)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                if (tipoPersona == "N") return RedirectToAction("IndexPersonaNatural");
                else return RedirectToAction("IndexPersonaJuridica");
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al visualizar tipo de cliente", ex);
                return View("~/Views/Shared/Error.cshtml"); }
        }


      /*--------------------------- Cliente Natural------------------------------ */


        public ActionResult IndexPersonaNatural(BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;

            try
            {
                

                numActivos = HelperPersonaNatural.selectCountActivos();
                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);

                ViewBag.prevPage = personaNaturalBuscar.prPage - 1;
                ViewBag.nextPage = personaNaturalBuscar.prPage + 1;
                ViewBag.numPages = numActivos / personaNaturalBuscar.prPageSize;
                if ((numActivos % personaNaturalBuscar.prPageSize) > 0) ViewBag.numPages++;

                return View(personaNaturalBuscar);
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al visualizar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        /*-----------------Registrar Cliente Natural--------------------------------*/

        public ActionResult RegistrarPersonaNatural()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                return View();
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); }
        }


        [HttpPost]

        public ActionResult RegistrarPersonaNatural(PersonaNatural personaNatural,  string prSexo)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                    TipoDocumento ti = (TipoDocumento)HelperTipoDocumento.selectById(personaNatural.prTipoDocumento.prIdTipoDocumento);
                    personaNatural.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                    ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                    personaNatural.prIdTipoPersona = 1;
                    personaNatural.prTipoDocumento = ti;
                    personaNatural.prEstado = "ACTIVO";
                    personaNatural.prSexo = prSexo;



                    Boolean existe = HelperPersonaNatural.ExistePersona(personaNatural.prCodigoDocumento);
                    Boolean esMayor = EsMayorEdad(personaNatural.prFechaNacimiento);
                    if (existe == true)
                    {
                        ModelState.AddModelError("prCodigoDocumento", "Ya existe la persona");
                        return View(personaNatural);
                    }
                    if (esMayor == false)
                    {
                        ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                        return View(personaNatural);
                    }
                    else if (ModelState.IsValid)
                    {
                        lock (lockObject)
                        {
                            personaNatural.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                            HelperPersonaNatural.insert(personaNatural);
                        }
                        ViewBag.mensaje = "Se registro correctamente al cliente Sr(a). " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                        ViewBag.returnURL = "/Cliente/IndexPersonaNatural";
                        return View("~/Views/Shared/Exito.cshtml");
                        
                    }


                    else return View(personaNatural);
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        /*-----------------Modificar Cliente Natural--------------------------------*/


        public ActionResult ModificarPersonaNatural(int? prIdPersona, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);

                if (!prIdPersona.HasValue)
                {
                    return View();
                }

                else
                {
                    ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
                    PersonaNatural personaNatural = HelperPersonaNatural.selectById(prIdPersona.Value);
                    if (personaNatural == null) return View();

                    return View(personaNatural);
                }
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al modificar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); }

        }


        [HttpPost]
        public ActionResult ModificarPersonaNatural(PersonaNatural personaNatural, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
                personaNatural.prIdTipoPersona = 1;
                Boolean esMayor = EsMayorEdad(personaNatural.prFechaNacimiento);
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(personaNatural);
                }

                else if (ModelState.IsValid)
                {
                    HelperPersonaNatural.update(personaNatural);
                    ViewBag.mensaje = "Se modifico correctamente al cliente " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                    ViewBag.returnURL = "/Cliente/IndexPersonaNatural";
                    return View("~/Views/Shared/Exito.cshtml");
                   
                }else return View(personaNatural);
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al modificar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); }


        }

        /*-----------------Eliminar Cliente Natural--------------------------------*/


        public ActionResult EliminarPersonaNatural(int? prIdPersona, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);

                if (!prIdPersona.HasValue)
                {
                    return View();
                }

                else
                {
                    ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
                    PersonaNatural personaNatural = HelperPersonaNatural.selectById(prIdPersona.Value);
                    if (personaNatural == null) return View();
                    return View(personaNatural);
                }
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al eliminar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }


        [HttpPost]
        public ActionResult EliminarPersonaNatural(PersonaNatural personaNatural)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                HelperPersonaNatural.delete(personaNatural);
                ViewBag.mensaje = "Se elimino correctamente al cliente " + personaNatural.prNombre + " "+ personaNatural.prApellidoPaterno;
                ViewBag.returnURL = "/Cliente/IndexPersonaNatural";
                return View("~/Views/Shared/Exito.cshtml");
               

            }
            catch(Exception ex) 
            {
                Logger.Current.Error("Error al eliminar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }



        /*------------------------Index Cliente Juridico ------------------------------*/


        public ActionResult IndexPersonaJuridica(BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;
            try
            {
               
                numActivos = HelperPersonaJuridica.selectCountActivos();
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
    
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al visualizar una persona juridica", ex);
                return  View("~/Views/Shared/Error.cshtml"); }

            ViewBag.prevPage = personaJuridicaBuscar.prPage - 1;
            ViewBag.nextPage = personaJuridicaBuscar.prPage + 1;
            ViewBag.numPages = numActivos / personaJuridicaBuscar.prPageSize;
            if ((numActivos % personaJuridicaBuscar.prPageSize) > 0) ViewBag.numPages++;
            return View(personaJuridicaBuscar);
        }



        /*-----------------Registrar Cliente Juridico--------------------------------*/


        public ActionResult RegistrarPersonaJuridica()
        {
            if (defaultAction != null) return defaultAction;
            return View();
        }

        [HttpPost]
        public ActionResult RegistrarPersonaJuridica(PersonaJuridica personaJuridica)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                personaJuridica.prIdPersona = (int)(HelperPersonaJuridica.SiguienteCodigo());
                personaJuridica.prIdTipoPersona = 1;
                personaJuridica.prEstado = "ACTIVO";

                if (personaJuridica.prRuc == null)
                {

                    ModelState.AddModelError("prRuc", "Se requiere saber el Ruc");
                }

                if (ModelState.IsValid)
                {
                    lock (lockObject)
                    {
                        personaJuridica.prIdPersona = (int)(HelperPersonaJuridica.SiguienteCodigo());
                        HelperPersonaJuridica.insert(personaJuridica);
                    }
                    ViewBag.mensaje = "Se registro correctamente al cliente Empresa: " + personaJuridica.prRazonSocial;
                    ViewBag.returnURL = "/Cliente/IndexPersonaJuridica";
                    return View("~/Views/Shared/Exito.cshtml");
             
                }


                else return View("RegistrarPersonaJuridica");
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar una persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }


        /*-----------------Modificar Cliente Juridico--------------------------------*/
        public ActionResult ModificarPersonaJuridica(int? prIdPersona, BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                //MI_modificar sin parametros
                if (!prIdPersona.HasValue)
                {
                    return View();
                }
                //MI_modificar con id?
                else
                {
                    ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                    PersonaJuridica personaJuridica = HelperPersonaJuridica.selectById(prIdPersona.Value);
                    if (personaJuridica == null) return View();
                    return View(personaJuridica);
                }
            }
            catch(Exception ex ) {

                Logger.Current.Error("Error al modificar una persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        [HttpPost]
        public ActionResult ModificarPersonaJuridica(PersonaJuridica personaJuridica, BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                personaJuridica.prIdTipoPersona = 1;
                personaJuridica.prEstado = "ACTIVO";
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);

                if (personaJuridica.prRuc ==null)
                {
                    ModelState.AddModelError("prRuc", "Se requiere conocer el RUC");
                    return View(personaJuridica);
                }
                if (ModelState.IsValid)
                {
                    HelperPersonaJuridica.update(personaJuridica);
                    ViewBag.mensaje = "Se modifico correctamente al cliente " + personaJuridica.prRazonSocial;
                    ViewBag.returnURL = "/Cliente/IndexPersonaJuridica";
                    return View("~/Views/Shared/Exito.cshtml");
                   
                }else return View(personaJuridica);
            }
            catch(Exception ex) {

                Logger.Current.Error("Error al modificar una persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }



        /*-----------------Eliminar Cliente Juridico--------------------------------*/
        public ActionResult EliminarPersonaJuridica(int? prIdPersona, BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                //MI_modificar sin parametros
                if (!prIdPersona.HasValue)
                {
                    return View();
                }
                //MI_modificar con id?
                else
                {
                    ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                    PersonaJuridica personaJuridica = HelperPersonaJuridica.selectById(prIdPersona.Value);
                    if (personaJuridica == null) return View();
                    return View(personaJuridica);
                }
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al eliminar una persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        [HttpPost]
        public ActionResult EliminarPersonaJuridica(PersonaJuridica personaJuridica)
        {
            if (defaultAction != null) return defaultAction;
            try
            {

                    HelperPersonaJuridica.delete(personaJuridica);
                    ViewBag.mensaje = "Se elimino correctamente al cliente " + personaJuridica.prRazonSocial;
                    ViewBag.returnURL = "/Cliente/IndexPersonaJuridica";
                    return View("~/Views/Shared/Exito.cshtml");
           
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al eliminar una persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }



        public Boolean EsMayorEdad(DateTime fechaNacimiento)
        {
              
                int edad = DateTime.Today.Year - fechaNacimiento.Year;
                if (new DateTime(DateTime.Today.Year, fechaNacimiento.Month, fechaNacimiento.Day) > DateTime.Today) edad--;
                if (edad > 18 && edad < 65) return true;
                else return false;
         
        }


    }

}